#include <stdio.h>
#include <stdlib.h>
#include "labirinto.h"
#include "resolvedor.h"

void navegador(LAB_tppLabirinto lab);
void navegadorResolvido(LAB_tppLabirinto lab);



void navegadorResolvido(LAB_tppLabirinto lab)
{
	RES_tpCondRet ret;
	ret = RES_Resolver(lab);

	if(ret == RES_CondRetImpossivel)
	{
		printf("Labirinto sem solucao!");
	} else
	{
		LAB_VaiParaEntrada(lab);
		navegador(lab);
	}
}


void navegador(LAB_tppLabirinto lab)
{
	int direcao;
	int achouSaida = 0;

	LAB_Imprimir(lab);

	do
	{
		LAB_tpCondRet ret = LAB_CondRetOK;
		system("cls");
		printf("Navegue com WASD e 0 para sair: \n");
		LAB_Imprimir(lab);
		if(achouSaida)
			printf("Parabens! Voce achou a saida!\n");

		direcao = getch();

		switch(direcao)
		{
		case 'w':
			ret = LAB_AndarNorte(lab);
			break;
		case 's':
			ret = LAB_AndarSul(lab);
			break;
		case 'a':
			ret = LAB_AndarOeste(lab);
			break;
		case 'd':
			ret = LAB_AndarLeste(lab);
			break;
		case '0':
			return;

		}
		if(ret == LAB_CondRetAchouSaida)
		{
			achouSaida = 1;
		}
		

	} while(direcao != '0');
}

void editarLabirinto(LAB_tppLabirinto lab){
	
	int xEditar;
	int yEditar;
	int posicaoInvalida = 0;
	int elementoInvalido = 0;

	LAB_tpElemento elemento;
	LAB_tpCondRet retorno;
	
	do {
		system("cls");
		LAB_Imprimir(lab);
		if(posicaoInvalida)
		{
			printf("\nPosicao Invalida!\n");
			posicaoInvalida = 0;
		}

		if(elementoInvalido)
		{
			printf("\nElemento Invalido!\n");
			elementoInvalido = 0;
		}


		do{
			printf("Informe a posicao x a ser editada ou -1 para sair: ") ;
		} while( scanf("%d", &xEditar) != 1 ) ;
		
		if ( xEditar == -1 )
			break;
	
		do
		{
			printf("Informe a posicao y a ser editada ou -1 para voltar: ") ;
		} while( scanf("%d", &yEditar) != 1) ;

		if ( yEditar == -1 )
			continue;
		
		do 
		{
			printf("Valores:\n 0: Vazio\n 1: Parede\n 2: Caminho\n");
			printf("Informe o valor do novo elemento -1 para sair: ");
		} while( scanf("%d", &elemento) != 1 ) ;

		if(elemento < -1 || elemento > 2)
		{
			elementoInvalido = 1;
			continue;
		}

		if(elemento == -1)
			break;

		retorno = LAB_SetarElemento(lab, xEditar, yEditar, elemento);

		if ( retorno == LAB_CondRetPosicaoInvalida)
			posicaoInvalida = 1;

	}
	while( 1 ) ;

}







int main()
{
	LAB_tppLabirinto lab = NULL;
	char nome[256];
	printf("Programa de Labirintos\nDigite o nome do arquivo de labirinto (sem espacos): ");
	scanf("%s", nome);
	
	lab = LAB_Criar(nome);
	
	if(lab != NULL) 
	{
		int opcao;
		
		//Mostrando MENU
		system("cls");
		printf("Labirinto Carregado com Sucesso!\n");
		do {
			do {
				
				printf("\n\nMENU\n1 - Navegador de Labirintos\n2 - Resolver e Navegar\n3 - Editor de Labirintos\n0 - Sair\n\nDigite sua opcao: ");
				scanf("%d", &opcao);
			} while(opcao<0 || opcao > 3);

			switch(opcao)
			{
				case 1:
					navegador(lab);
					break;
				case 2:
					navegadorResolvido(lab);
					break;
				case 3:
					editarLabirinto(lab);
					break;
				case 0:
					printf("\nFechando aplicativo!\n");
					break;
				default:
					printf("\nOpcao Invalida!\n");
			}
		} while(opcao != 0);

	}

	return 0;
}